package it.unisa.unibox.Storage;

import it.unisa.unibox.beans.AltroProdotto;
import it.unisa.unibox.beans.ArticoloLibro;
import it.unisa.unibox.beans.ArticoloRivista;
import it.unisa.unibox.beans.AttiCongresso;
import it.unisa.unibox.beans.Brevetto;
import it.unisa.unibox.beans.Curatela;
import it.unisa.unibox.beans.Monografia;
import it.unisa.unibox.beans.Prodotto;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.bridge.IProdottiManager;
import it.unisa.unibox.commons.DBConnection;
import it.unisa.unibox.commons.DBConstants;
import it.unisa.unibox.commons.DBNames;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class DBGestioneProdotti implements IProdottiManager {

	private static DBGestioneProdotti dbgestioneprodotti;

	/**
	 * Singleton pattern, restituisce un'istanza dell'oggetto
	 * @return l'oggetto
	 */
	public static DBGestioneProdotti getInstance() {
		if (dbgestioneprodotti == null)
			dbgestioneprodotti = new DBGestioneProdotti();
		return dbgestioneprodotti;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Altro
	 * @param ap il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciAltroProdotto(AltroProdotto ap) throws SQLException {
		// inserisco nella tabella prodotto
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(ap);

		String format = "INSERT INTO `altro`(`ID_Prodotto`, `descrizione`) VALUES ('%s', '%s');";
		String query = String.format(format, idExternal, ap.getDescrizione());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto ArticoloLibro
	 * @param al il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciArticoloLibro(ArticoloLibro al) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(al);

		String format = "INSERT INTO `articolo_libro`(`ID_Prodotto`, `ISBN`, `editore`, `daPagina`, `aPagina`) VALUES ('%s', '%s', '%s', '%s', '%s')";
		String query = String.format(format, idExternal, al.getISBN(),
				al.getEditore(), al.getDaPagina(), al.getaPagina());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto ArticoloRivista
	 * @param ar il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciArticoloRivista(ArticoloRivista ar) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(ar);

		String format = "INSERT INTO `articolo_rivista`(`ID_Prodotto`, `ISSN`, `nomeRivista`, `daPagina`, `aPagina`) VALUES ('%s', '%s', '%s', '%s', '%s')";
		String query = String.format(format, idExternal, ar.getISSN(),
				ar.getNomeRivista(), ar.getDaPagina(), ar.getaPagina());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Monografia
	 * @param m il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciMonografia(Monografia m) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(m);

		String format = "INSERT INTO `monografia`(`ID_Prodotto`, `volume`, `argomento`) VALUES ('%s', '%s', '%s')";
		String query = String.format(format, idExternal, m.getVolume(),
				m.getArgomento());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Curatela
	 * @param c il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciCuratela(Curatela c) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(c);

		String format = "INSERT INTO `curatela`(`ID_Prodotto`, `testo`) VALUES ('%s', '%s')";
		String query = String.format(format, idExternal, c.getTesto());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto AttiCongresso
	 * @param ac il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciAttiCongresso(AttiCongresso ac) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(ac);

		String format = "INSERT INTO `atti_congresso`(`ID_Prodotto`, `luogo`, `conferenza`, `data`) VALUES ('%s', '%s', '%s', '%s')";
		String query = String.format(format, idExternal, ac.getLuogo(),
				ac.getConferenza(), ac.getData());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF 1.1 e 1.2 inserimento prodotto Brevetto
	 * @param b il prodotto da inserire
	 * @return l'id del prodotto inserito, 0 in caso di errore
	 * @throws SQLException
	 */
	@Override
	public int inserisciBrevetto(Brevetto b) throws SQLException {
		int idExternal = DBUtilityQuerys.getInstance().insertProdotto(b);

		String format = "INSERT INTO `brevetto`(`ID_Prodotto`, `durata`, `estensione`) VALUES ('%s', '%s', '%s')";
		String query = String.format(format, idExternal, b.getDurata(),
				b.getEstensione());
		int ret = DBConnection.execUpdate(query);

		return idExternal;
	}

	/**
	 * RF_1.3 Ricerca prodotti
	 * @param tipologiaProdotto
	 * @param rangeAnnoStart
	 * @param rangeAnnoEnd
	 * @param titoloProdotto
	 * @param nomeRicercatore
	 * @param cognomeRicercatore
	 * @param codiceFiscale
	 * @param idDipartimento
	 * @param idAreaScientifica
	 * @return lista di risultati
	 * @throws SQLException
	 */
	@Override
	public ArrayList<Prodotto> ricercaProdotti(String tipologiaProdotto,
			int rangeAnnoStart, int rangeAnnoEnd, String titoloProdotto,
			String nomeRicercatore, String cognomeRicercatore,
			String codiceFiscale, String idDipartimento,
			String idAreaScientifica) throws SQLException {


		String format = "SELECT *";
		format += " FROM prodotto";
		format += " JOIN ricercatore ON prodotto.responsabile = ricercatore.ID";
		format += " JOIN dipartimento ON ricercatore.dipartimento = dipartimento.ID";
		format += " JOIN area_scientifica ON ricercatore.area_scientifica = area_scientifica.ID";
		format += " WHERE prodotto.titolo LIKE  '%%%s%%'";
		format += " AND prodotto.tipologia LIKE  '%%%s%%'";
		format += " AND dipartimento.id LIKE  '%s'";
		format += " AND area_scientifica.id LIKE  '%s'";
		format += " AND ricercatore.nome LIKE  '%%%s%%'";
		format += " AND ricercatore.cognome LIKE  '%%%s%%'";
		format += " AND ricercatore.codFisc LIKE  '%%%s%%'";
		format += " AND prodotto.anno >=" + rangeAnnoStart;
		format += " AND prodotto.anno <=" + rangeAnnoEnd;
		format += " AND (prodotto.stato =" + DBConstants.PRODOTTO_STATO_VALIDATO+" OR prodotto.stato = " + DBConstants.PRODOTTO_STATO_INVIATO+")";

		// TODO aggiungere and prodotto.stato==4 OR prodotto.stato==6
		if (idDipartimento.equals(""))
			idDipartimento = "%";
		if (idAreaScientifica.equals(""))
			idAreaScientifica = "%";
		String query = String.format(format, titoloProdotto, tipologiaProdotto,
				idDipartimento, idAreaScientifica, nomeRicercatore,
				cognomeRicercatore, codiceFiscale);


		System.out.println(query);// TODO rimuovere, stampa di prova
		ResultSet rs = DBConnection.execQuery(query);
		String prefisso = DBNames.TABLE_PRODOTTO + ".";
		ArrayList<Prodotto> list = new ArrayList<Prodotto>();
		int id;
		Ricercatore responsabile;
		String tipologia;
		String titolo;
		String abstract_field;
		int stato;
		int pubblico;
		int anno;
		String lingua;
		String url;
		String note;

		while (rs.next()) {
			id = rs.getInt(prefisso + "ID");
			// responsabile_valutazione
			responsabile = DBUtilityQuerys.getInstance().retrieveRicercatore(
					rs.getInt(prefisso + "responsabile"));
			tipologia = rs.getString(prefisso + "tipologia");
			titolo = rs.getString(prefisso + "titolo");
			abstract_field = rs.getString(prefisso + "abstract");
			stato = rs.getInt(prefisso + "stato");
			pubblico = rs.getInt(prefisso + "pubblico");
			anno = rs.getInt(prefisso + "anno");
			lingua = rs.getString(prefisso + "lingua");
			url = rs.getString(prefisso + "url");
			note = rs.getString(prefisso + "note");
			Prodotto p = new Prodotto(id, responsabile, tipologia, titolo,
					abstract_field, stato, pubblico, anno, lingua, url, note);
			list.add(p);
		}

		return list;
	}

	public ArrayList<Prodotto> tuttiProdotti() throws SQLException {
		// TODO questo è uno STUB METHOD che spara fuori tutti i prodotti senza
		// discernimento e senza paramentri: la query e' banale

		String query = "SELECT * FROM prodotto;";
		ResultSet rs = DBConnection.execQuery(query);
		ArrayList<Prodotto> list = new ArrayList<Prodotto>();
		int id;
		Ricercatore responsabile;
		String tipologia;
		String titolo;
		String abstract_field;
		int stato;
		int pubblico;
		int anno;
		String lingua;
		String url;
		String note;
		while (rs.next()) {
			id = rs.getInt("ID");
			responsabile = null; // TODO retreive responsabile from
			// responsabile_valutazione
			tipologia = rs.getString("tipologia");
			titolo = rs.getString("titolo");
			abstract_field = rs.getString("abstract");
			stato = rs.getInt("stato");
			pubblico = rs.getInt("pubblico");
			anno = rs.getInt("anno");
			lingua = rs.getString("lingua");
			url = rs.getString("url");
			note = rs.getString("note");
			Prodotto p = new Prodotto(id, responsabile, tipologia, titolo,
					abstract_field, stato, pubblico, anno, lingua, url, note);
			list.add(p);
		}

		return list;
	}

	/**
	 * RF 1.4 Visualizzazione prodotto
	 * @param id 
	 * @return prodotto
	 * @throws SQLException
	 */
	@Override
	public Prodotto getProdotto(int idProdotto) throws SQLException {

		String query = "SELECT * FROM prodotto WHERE ID='" + idProdotto + "';";
		//System.out.println(query);
		ResultSet rs = DBConnection.execQuery(query);
		Prodotto p = null;
		int id;
		Ricercatore responsabile;
		String tipologia;
		String titolo;
		String abstract_field;
		int stato;
		int pubblico;
		int anno;
		String lingua;
		String url;
		String note;
		if (rs.next()) {
			id = rs.getInt("ID");
			responsabile = DBUtilityQuerys.getInstance().retrieveRicercatore(
					rs.getInt("responsabile"));
			tipologia = rs.getString("tipologia");
			titolo = rs.getString("titolo");
			abstract_field = rs.getString("abstract");
			stato = rs.getInt("stato");
			pubblico = rs.getInt("pubblico");
			anno = rs.getInt("anno");
			lingua = rs.getString("lingua");
			url = rs.getString("url");
			note = rs.getString("note");
			p = new Prodotto(id, responsabile, tipologia, titolo,
					abstract_field, stato, pubblico, anno, lingua, url, note);
		}

		return p;
	}


	/**
	 * RF 1.5 modifica prodotto Altro
	 * 
	 * @param ap il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaAltroProdotto(AltroProdotto ap) throws SQLException {
	
		DBUtilityQuerys.getInstance().updateProdotto(ap);

		String format = "UPDATE `db_unibox`.`altro` SET `descrizione`='%s' WHERE `altro`.`ID_Prodotto`= '%s';";
		String query = String.format(format, ap.getDescrizione(), ap.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto ArticoloLibro
	 * 
	 * @param al il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaArticoloLibro(ArticoloLibro al) throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(al);

		String format = "UPDATE  `db_unibox`.`articolo_libro` SET  `ISBN` =  '%s', `editore` =  '%s', `daPagina` =  '%s', `aPagina` =  '%s' WHERE  `articolo_libro`.`ID_Prodotto` = '%s';";
		String query = String.format(format, al.getISBN(), al.getEditore(),
				al.getDaPagina(), al.getaPagina(), al.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto ArticoloRivista
	 * 
	 * @param ar il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaArticoloRivista(ArticoloRivista ar)
			throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(ar);

		String format = "UPDATE `db_unibox`.`articolo_rivista` SET `ISSN` = '%s', `nomeRivista` = '%s', `daPagina` = '%s', `aPagina` = '%s' WHERE `articolo_rivista`.`ID_Prodotto` = '%s';";
		String query = String.format(format, ar.getISSN(), ar.getNomeRivista(),
				ar.getDaPagina(), ar.getaPagina(), ar.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto Monografia
	 * 
	 * @param m il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaMonografia(Monografia m) throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(m);

		String format = "UPDATE  `db_unibox`.`monografia` SET  `volume` =  '%s', `argomento` =  '%s' WHERE  `monografia`.`ID_Prodotto` = '%s';";
		String query = String.format(format, m.getVolume(), m.getArgomento(),
				m.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto Curatela
	 * 
	 * @param c il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaCuratela(Curatela c) throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(c);

		String format = "UPDATE  `db_unibox`.`curatela` SET  `testo` =  '%s' WHERE  `curatela`.`ID_Prodotto` = '%s';";
		String query = String.format(format, c.getTesto(), c.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto AttiCongresso
	 * 
	 * @param ac il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaAttiCongresso(AttiCongresso ac) throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(ac);

		String format = "UPDATE  `db_unibox`.`atti_congresso` SET  `luogo` =  '%s', `conferenza` =  '%s', `data` =  '%s' WHERE  `atti_congresso`.`ID_Prodotto` = '%s';";
		String query = String.format(format, ac.getLuogo(), ac.getConferenza(),
				ac.getData(), ac.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}

	/**
	 * RF 1.5 modifica prodotto Brevetto
	 * 
	 * @param b il prodotto da modificare
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean modificaBrevetto(Brevetto b) throws SQLException {
		DBUtilityQuerys.getInstance().updateProdotto(b);

		String format = "UPDATE  `db_unibox`.`brevetto` SET  `durata` =  '%s', `estensione` =  '%s' WHERE  `brevetto`.`ID_Prodotto` = '%s';";
		String query = String.format(format, b.getDurata(), b.getEstensione(),
				b.getId());
		int ret = DBConnection.execUpdate(query);

		return (ret == 1);
	}


	/**
	 * RF_1.6 Stampa prodotto
	 * @param idProdotto
	 * @return l'url del prodotto
	 * @throws SQLException
	 */
	@Override
	public String stampaProdotto(int idProdotto) throws SQLException {


		String query;
		query = "SELECT url from prodotto WHERE id = " +idProdotto;
		ResultSet rs = DBConnection.execQuery(query);		
		if (rs.next())
			return rs.getString("url");

		return null;
	}

	/**
	 * RF 1.7 elimina prodotto 
	 * 
	 * @param idProdotto
	 * @return true se l'operazione va a buon fine, false altrimenti
	 */
	@Override
	public boolean eliminaProdotto(int idProdotto) throws SQLException {

		String query;
		query = "DELETE FROM `db_unibox`.`lista_prodotti_selezionati` WHERE `lista_prodotti_selezionati`.`ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`lista_autori` WHERE `lista_autori`.`ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`monografia` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`altro` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`articolo_libro` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`articolo_rivista` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`atti_congresso` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`brevetto` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`curatela` WHERE `ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		// query =
		// " DELETE invia_ricevi FROM invia_ricevi INNER JOIN (SELECT notifica.ID FROM notifica INNER JOIN prodotto ON notifica.ID_Prodotto = Prodotto.ID WHERE Prodotto.ID = '"+idProdotto+"')  AS var ON invia_ricevi.ID_Notifica = var.ID;";
		// DBUtility.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`notifica` WHERE `notifica`.`ID_Prodotto` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);
		query = " DELETE FROM `db_unibox`.`prodotto` WHERE `ID` = '"
				+ idProdotto + "';";
		DBConnection.execUpdate(query);

		return true;
	}

	/**
	 * RF_1.8 valida il riconoscimento
	 * @param idProdotto
	 * @param idRicercatore
	 * @return true se l'operazione va a buon fine, false altrimenti
	 * @throws SQLException
	 */
	@Override
	public boolean validaRiconoscimento(int idProdotto, int idRicercatore)
			throws SQLException {

		String query = "INSERT INTO `lista_autori`(`ID_Prodotto`, `ID_Ricercatore`) VALUES ('"
				+ idProdotto + "','" + idRicercatore + "');";
		int result = DBConnection.execUpdate(query);

		query = "delete from notifica where ID_Prodotto ="+idProdotto+" and destinatario = "+idRicercatore;
		result = DBConnection.execUpdate(query);

		return (result == 1);
	}

	/**
	 * Controlla conflitti
	 * @param id 
	 * @param titolo
	 * @param tipologia
	 * @param anno
	 * @param url
	 * @return true se c'e conflitto, false altrimenti
	 * @throws SQLException
	 */
	@Override
	public boolean checkConflitto(int id, String titolo, String tipologia, int anno,
			String url) throws SQLException {

		String format = "SELECT * FROM `prodotto` WHERE `tipologia`='%s' AND `titolo`='%s' AND `anno`='%s' AND `url`='%s' AND id !="+id;
		String query = String.format(format, tipologia, titolo, anno, url);
		//System.out.println(query);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {

			return true;
		} else {

			return false;
		}
	}
	
	public AltroProdotto getAltroProdotto(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		AltroProdotto ap = null;

		String query = "SELECT * FROM  `altro` WHERE  `ID_Prodotto` ='%s';";
		query = String.format(query, idProdotto);
		//System.out.println(query);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			String descrizione = rs.getString("descrizione");
			ap = new AltroProdotto(p.getId(), p.getResponsabile(),
					p.getTipologia(), p.getTitolo(), p.getAbstract_field(),
					p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
					p.getUrl(), p.getNote(), descrizione);
		}

		return ap;
	}

	public ArticoloLibro getArticoloLibro(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		ArticoloLibro al = null;

		String query = "SELECT * FROM  `articolo_libro` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			String isbn = rs.getString("ISBN");
			String editore = rs.getString("editore");
			int daPagina = rs.getInt("daPagina");
			int aPagina = rs.getInt("aPagina");
			al = new ArticoloLibro(p.getId(), p.getResponsabile(),
					p.getTipologia(), p.getTitolo(), p.getAbstract_field(),
					p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
					p.getUrl(), p.getNote(), isbn, editore, daPagina, aPagina);
		}

		return al;
	}

	public ArticoloRivista getArticoloRivista(int idProdotto)
			throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		ArticoloRivista ar = null;

		String query = "SELECT * FROM  `articolo_rivista` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			String issn = rs.getString("ISSN");
			String nomeRivista = rs.getString("nomeRivista");
			int daPagina = rs.getInt("daPagina");
			int aPagina = rs.getInt("aPagina");
			ar = new ArticoloRivista(p.getId(), p.getResponsabile(),
					p.getTipologia(), p.getTitolo(), p.getAbstract_field(),
					p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
					p.getUrl(), p.getNote(), issn, nomeRivista, daPagina,
					aPagina);
		}

		return ar;
	}

	public Monografia getMonografia(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		Monografia m = null;

		String query = "SELECT * FROM  `monografia` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			int volume = rs.getInt("volume");
			String argomento = rs.getString("argomento");
			m = new Monografia(p.getId(), p.getResponsabile(),
					p.getTipologia(), p.getTitolo(), p.getAbstract_field(),
					p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
					p.getUrl(), p.getNote(), volume, argomento);
		}

		return m;
	}

	public Curatela getCuratela(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		Curatela c = null;

		String query = "SELECT * FROM  `curatela` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			String testo = rs.getString("testo");
			c = new Curatela(p.getId(), p.getResponsabile(), p.getTipologia(),
					p.getTitolo(), p.getAbstract_field(), p.getStato(),
					p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
					p.getNote(), testo);
		}

		return c;
	}

	public AttiCongresso getAttiCongresso(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		AttiCongresso ac = null;

		String query = "SELECT * FROM  `atti_congresso` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			String luogo = rs.getString("luogo");
			String conferenza = rs.getString("conferenza");
			String data = rs.getString("data");
			ac = new AttiCongresso(p.getId(), p.getResponsabile(),
					p.getTipologia(), p.getTitolo(), p.getAbstract_field(),
					p.getStato(), p.getPubblico(), p.getAnno(), p.getLingua(),
					p.getUrl(), p.getNote(), luogo, conferenza, data);
		}

		return ac;
	}

	public Brevetto getBrevetto(int idProdotto) throws SQLException {
		Prodotto p = getProdotto(idProdotto);
		Brevetto b = null;

		String query = "SELECT * FROM  `brevetto` WHERE  `ID_Prodotto` ='%s'";
		query = String.format(query, idProdotto);
		ResultSet rs = DBConnection.execQuery(query);
		if (rs.next()) {
			int durata = rs.getInt("durata");
			String estensione = rs.getString("estensione");
			b = new Brevetto(p.getId(), p.getResponsabile(), p.getTipologia(),
					p.getTitolo(), p.getAbstract_field(), p.getStato(),
					p.getPubblico(), p.getAnno(), p.getLingua(), p.getUrl(),
					p.getNote(), durata, estensione);
		}

		return b;
	}
}
